package server;

import static server.RLM_Server.databaseModul;
import server_commands.Command;
import server_commands.CommandFactory;
import utils.Constants;
import connection_modul.DatabaseConnection;

/**
 * Thread zaduzen za citanje poruke iz stream-a i obradu klijentskih zahteva. Thread
 * je blokiran u readData() metodi, dok iz stream-a ne stigne neki podatak.
 * 
 * @author Uros Krkic
 */
public class ServerThreadReader extends Thread implements Constants {
	
	/**
	 * Referenca na socket konekciju.
	 */
	private ServerSocketConnection connection;
	
	/**
	 * Objekat koji predstavalja konekciju sa bazom. Skladisti konekciju koja se
	 * posredstvom dbModul-a dobija i pool-a konekcija ka bazi.
	 */
	private DatabaseConnection dbConnection;
	
	
	
	/**
	 * Konstruktor.
	 * @param connection - referenca na socket konekiciju
	 * @author Uros Krkic
	 */
	public ServerThreadReader(ServerSocketConnection connection) {
		this.connection = connection;
		this.start();
	}
	
	
	
	@Override
	public void run() {
		
		String request;
		
		while ( (request = connection.readData()) != null ) {
			// TODO obrisati
			System.out.println("REQUEST = " + request);
			
			Command command;
			
			command = CommandFactory.createCommand(request);
			
			if (command == null) {
				// greska
				System.out.println("GRESKA");
				continue;
			}
			
			dbConnection = new DatabaseConnection(databaseModul);
			
			boolean flag = command.executeCommand(connection, dbConnection);
			
			// TODO obrisati
			if (flag == true) {
				System.out.println("Komanda JESTE uspesno izvrsena");
			}
			else {
				System.out.println("Komanda NIJE uspesno izvrsena");
			}
			
			dbConnection.closeConnection();
			
			
			if (command.getCode() == LOGOUT_CMD || command.getCode() == UNREG_CMD) {
				
				// mora da spava neko vreme, da se ne bi zatvorila konekcija
				// ukoliko se jos uvek njom salje odgovor na komandu LOGOUT
//				try {
//					Thread.sleep(1000);
//				}
//				catch (InterruptedException ie) {
//					ie.printStackTrace();
//				}
				connection.quitConnection();
				break;
			}
			
		}
	}
	
	
}
